package com.htl.exampro.user.util;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.model.ClassAnnotationAttributes;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

/*
        <!--mybatis-plus代码生成器相关依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.10</version>
        </dependency>
 */
public class MybatisPlusGenerator {
    //====================配置变量区域=====================//
    private static final String author = "hehehe";//生成文件的作者，可以不填
    private static final String rootPackage = "com.hhh.exampro";//生成的entity、controller、service等包所在的公共上一级包路径全限定名
    private static final String moduleName = "";
    private static final String url = "jdbc:mysql://localhost:3306/exam-pro?characterEncoding=UTF-8&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
    private static final String username = "root";
    private static final String password = "123456";
    private static final String[] tableNames = {
//            "user" ,
//            "exam" ,
//            "paper" ,
//            "question" ,
//            "paper_question" ,
            "course" ,
//            "course_detail" ,
//            "user_course" ,
//            "exam_result" ,
//            "question_history" ,
//            "question_type"
    };//表名
    private static final String tablePrefix = "";//忽略表名前缀
    //====================配置变量区域=====================//

    public static void main(String[] args) {
        fastAutoGenerator();

//        autoGenerator();

    }


    /**
     * mybatis-plus-generator 3.5.x之后新的生成方式
     */
    public static void fastAutoGenerator() {
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> builder
                        .outputDir(System.getProperty("user.dir") + "/" + moduleName + "/src/main/java")
                        .dateType(DateType.TIME_PACK) // 使用 java.time 包下的日期类型
//                        .enableSwagger()       // 开启 Swagger
                        .enableSpringdoc()       // 开启 SpringDoc
                        .author(author)
                        .commentDate("yyyy-MM-dd")
                )
                .packageConfig(builder -> builder
                        .parent(rootPackage)
                        .moduleName("")
                        .entity("pojo")
                        .mapper("mapper")
                        .service("service")
                        .serviceImpl("service.impl")
                        .controller("controller")
                        .xml("mapper.mapper")
                )
                .strategyConfig(builder -> builder
                                .addInclude(tableNames)  // 指定生成的表

                                .entityBuilder()
                                .enableFileOverride()      // 覆盖已生成文件
//                .disableSerialVersionUID()     // 禁用 serialVersionUID
                                .enableLombok()          // 启用 Lombok
                                .toString(true)
//                                .enableChainModel()      // 链式模型
//                                .enableActiveRecord()          // 启用 ActiveRecord 模式
                                .enableColumnConstant()        // 生成字段常量（如 public static final String ID = "id";）
                                .enableTableFieldAnnotation()
                                .naming(NamingStrategy.underline_to_camel)  // 实体类字段命名策略
                                .columnNaming(NamingStrategy.underline_to_camel)  // 列名下划线转驼峰
                                .formatFileName("%sDO")
                                .addClassAnnotation(new ClassAnnotationAttributes(NoArgsConstructor.class))
                                .addClassAnnotation(new ClassAnnotationAttributes(AllArgsConstructor.class))

                                .controllerBuilder()
                                .enableFileOverride()          // 覆盖已生成文件
                                .enableHyphenStyle()           // 路径使用连字符（如 /user-info）
                                .enableRestStyle()       // 生成 @RestController

                                .mapperBuilder()
                                .enableFileOverride()
                                .enableBaseResultMap()         // 生成 BaseResultMap
                                .enableBaseColumnList()        // 生成 BaseColumnList

                                .serviceBuilder()
                                .enableFileOverride()
                                .formatServiceFileName("%sService")
                )
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
    /**
     * mybatis-plus-generator 3.5.x之前的生成方式
     */
/*    public static void autoGenerator() {

        // 代码生成器
        AutoGenerator generator = new AutoGenerator();
        // 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        globalConfig.setOutputDir(projectPath + "/" + moduleName + "/src/main/java");
        globalConfig.setFileOverride(true);//是否覆盖已有文件，默认false
        globalConfig.setOpen(false);//是否打开输出目录
        globalConfig.setAuthor(author);
        globalConfig.setServiceName("%sService");//去掉service接口的首字母I
        globalConfig.setEntityName("%sDO");
        globalConfig.setBaseResultMap(true);//开启 BaseResultMap
        globalConfig.setBaseColumnList(true);
        globalConfig.setDateType(DateType.TIME_PACK);//只使用 java.util.date代替
        globalConfig.setIdType(IdType.ASSIGN_ID);// 雪花算法生成主键 //分配ID (主键类型为number或string）,auto:新增时id自增
        globalConfig.setSwagger2(true);
        generator.setGlobalConfig(globalConfig);

        // 数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl(url);
        dataSourceConfig.setDbType(DbType.MYSQL);//数据库类型
        dataSourceConfig.setDriverName(driverClassName);
        dataSourceConfig.setUsername(username);
        dataSourceConfig.setPassword(password);
        generator.setDataSource(dataSourceConfig);

        // 包配置
        PackageConfig packageConfig = new PackageConfig();
        //packageConfig.setModuleName(scanner("模块名"));
        packageConfig.setParent(rootPackage);//例：org.jeecg.modules.xqxy
        packageConfig.setEntity("pojo");
        generator.setPackageInfo(packageConfig);

        //注意：模板引擎在mybatisplus依赖中的templates目录下，可以依照此默认模板进行自定义

        // 策略配置：配置根据哪张表生成代码
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude(tableNames);//表名，多个英文逗号分割（与exclude二选一配置）
        strategy.setTablePrefix(tablePrefix);
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        strategy.setEntityLombokModel(false);//lombok模型，@Accessors(chain = true)setter链式操作
        strategy.setRestControllerStyle(true);//controller生成@RestController
        strategy.setEntityTableFieldAnnotationEnable(true);//是否生成实体时，生成字段注解

        generator.setStrategy(strategy);
        generator.setTemplateEngine(new FreemarkerTemplateEngine());
        generator.execute();

    }*/


}
